/*!
 * @file point3f.hh
 * @brief Klasa punktu [3 floaty]
 */

#ifndef __ENGINE_BASIC_POINT3F_HH
#define __ENGINE_BASIC_POINT3F_HH

#include <cmath>
#include <iostream>

#include "engine/basic/point2f.hh"

/*!
 * @brief Punkt w przestrzeni trzech wymiarów.
 */
class point3f {
public:
	/*!
	 * @brief Konstruktor. Tworzy punkt (0,0,0)
	 * @return Obiekt.
	 */
	point3f();

	/*!
	 * @brief Konstrukotr. Tworzy punkt (x,y,z)
	 * @param x Współrzędna
	 * @param y Współrzędna
	 * @param z Współrzędna
	 * @return Obiekt
	 */
	point3f(float x, float y, float z);

	/*!
	 * @brief Normalizacja punktu.
	 */
	void normalize();

	/*!
	 * @brief Długość/Odległość od punktu (0,0,0)
	 */
	float length();

	point2f xz();

	/*!
	 * @brief Współrzędna pierwsza.
	 */
	float x;

	/*!
	 * @brief Współrzędna druga.
	 */
	float y;

	/*!
	 * @brief Współrzędna trzecia.
	 */
	float z;

private:
};

/*!
 * @brief Wypisywanie punktu
 * @param out Strumień wyjściowy
 * @param val Punkt
 * @return Strumień wyjściowy
 */
std::ostream & operator <<(std::ostream & out, point3f & val);

/*!
 * @brief Dodawanie punktów
 * @param p1 Punkt 1.
 * @param p2 Punkt 2.
 * @return Punkt stanowiący sumę.
 */
point3f operator +(point3f p1, point3f p2);

/*!
 * @brief Odejmowanie punktów
 * @param p1 Pierwszy punkt
 * @param p2 Drugi punkt
 * @return Punkt stanowiący różnicę.
 */
point3f operator -(point3f p1, point3f p2);

/*!
 * @brief Iloczyn wektorowy
 * @param v Wektor [punkt] pierwszy
 * @param w Wektor [punkt] drugi
 * @return Wektor prostopadły
 */
point3f operator *(point3f v, point3f w);

/*!
 * @brief Iloczyn wektorowy
 * @param v Wektor [punkt] pierwszy
 * @param w Liczba
 * @return Wektor prostopadły
 */
point3f operator *(point3f v, float w);

/*!
 * @brief Zmniejszanie długości wektora
 * @param v Wektor
 * @param what Przez ile podzielić
 * @return Zmniejszony wektor [punkt]
 */
point3f operator /(point3f v, float what);

#else
class point3f;
#endif
